package permission

import (
	"time"

	"gorm.io/gorm"
)

// Permission 权限模型
type Permission struct {
	ID          uint           `json:"id" gorm:"primaryKey;autoIncrement" comment:"权限ID"`
	Name        string         `json:"name" gorm:"size:100;not null" binding:"required" comment:"权限名称"`
	Code        string         `json:"code" gorm:"size:100" comment:"权限编码"`
	DisplayName string         `json:"display_name" gorm:"size:100;not null" binding:"required" comment:"显示名称"`
	Description string         `json:"description" gorm:"size:255" comment:"权限描述"`
	Path        string         `json:"path" gorm:"size:255" comment:"权限路径"`
	Method      string         `json:"method" gorm:"size:10" comment:"请求方法"`
	ParentID    *uint          `json:"parent_id" gorm:"index" comment:"父权限ID"`
	Level       int            `json:"level" gorm:"default:1" comment:"权限层级"`
	Sort        int            `json:"sort" gorm:"default:0" comment:"排序"`
	Type        string         `json:"type" gorm:"size:20;default:menu" comment:"权限类型(menu:菜单 button:按钮 api:接口)"`
	Icon        string         `json:"icon" gorm:"size:100" comment:"图标"`
	Status      int            `json:"status" gorm:"default:1;not null" comment:"状态(1:启用 0:禁用)"`
	CreatedAt   time.Time      `json:"created_at" gorm:"autoCreateTime" comment:"创建时间"`
	UpdatedAt   time.Time      `json:"updated_at" gorm:"autoUpdateTime" comment:"更新时间"`
	DeletedAt   gorm.DeletedAt `json:"deleted_at" gorm:"index" comment:"删除时间"`

	// 子权限关系通过手动查询管理，不使用 GORM 外键
}

// TableName 设置表名
func (Permission) TableName() string {
	return "permissions"
}

// CreateRequest 创建权限请求
type CreateRequest struct {
	Name        string `json:"name" binding:"required" comment:"权限名称"`
	Code        string `json:"code" binding:"required" comment:"权限编码"`
	DisplayName string `json:"display_name" comment:"显示名称"`
	Description string `json:"description" comment:"权限描述"`
	Path        string `json:"path" comment:"权限路径"`
	Method      string `json:"method" comment:"请求方法"`
	ParentID    *uint  `json:"parent_id" comment:"父权限ID"`
	Type        string `json:"type" comment:"权限类型"`
	Icon        string `json:"icon" comment:"图标"`
	Sort        *int   `json:"sort" comment:"排序"`
	Status      *int   `json:"status" comment:"状态"`
}

// UpdateRequest 更新权限请求
type UpdateRequest struct {
	Name        *string `json:"name" comment:"权限名称"`
	DisplayName *string `json:"display_name" comment:"显示名称"`
	Description *string `json:"description" comment:"权限描述"`
	Path        *string `json:"path" comment:"权限路径"`
	Method      *string `json:"method" comment:"请求方法"`
	ParentID    *uint   `json:"parent_id" comment:"父权限ID"`
	Type        *string `json:"type" comment:"权限类型"`
	Icon        *string `json:"icon" comment:"图标"`
	Sort        *int    `json:"sort" comment:"排序"`
	Status      *int    `json:"status" comment:"状态"`
	Code        *string `json:"code" comment:"权限编码"`
}

// QueryRequest 查询权限请求
type QueryRequest struct {
	Page        int    `json:"page" form:"page" binding:"min=1"`
	PageSize    int    `json:"page_size" form:"page_size" binding:"min=1,max=100"`
	Keyword     string `json:"keyword" form:"keyword"`
	Name        string `json:"name" form:"name"`
	DisplayName string `json:"display_name" form:"display_name"`
	Type        string `json:"type" form:"type"`
	ParentID    *uint  `json:"parent_id" form:"parent_id"`
	Status      *int   `json:"status" form:"status"`
}

// PermissionTree 权限树节点
type PermissionTree struct {
	ID          uint             `json:"id"`
	Name        string           `json:"name"`
	Code        string           `json:"code"`
	DisplayName string           `json:"display_name"`
	Description string           `json:"description"`
	Path        string           `json:"path"`
	Method      string           `json:"method"`
	ParentID    *uint            `json:"parent_id"`
	Level       int              `json:"level"`
	Sort        int              `json:"sort"`
	Type        string           `json:"type"`
	Icon        string           `json:"icon"`
	Status      int              `json:"status"`
	CreatedAt   time.Time        `json:"created_at"`
	UpdatedAt   time.Time        `json:"updated_at"`
	Children    []PermissionTree `json:"children"`
}
